#ifndef _OTA_H
#define _OTA_H

#include <functional>
#include <string>
#include <map>

// OTA（空中升级）类：管理固件升级相关功能
class Ota {
public:
    // 构造函数和析构函数
    Ota();
    ~Ota();

    // 设置版本检查URL
    void SetCheckVersionUrl(std::string check_version_url);
    // 设置HTTP请求头
    void SetHeader(const std::string& key, const std::string& value);
    // 设置POST数据
    void SetPostData(const std::string& post_data);
    // 检查新版本
    bool CheckVersion();
    // 检查是否有新版本
    bool HasNewVersion() { return has_new_version_; }
    // 检查是否有MQTT配置
    bool HasMqttConfig() { return has_mqtt_config_; }
    // 检查是否有激活码
    bool HasActivationCode() { return has_activation_code_; }
    // 检查是否有服务器时间
    bool HasServerTime() { return has_server_time_; }
    // 开始升级
    void StartUpgrade(std::function<void(int progress, size_t speed)> callback);
    // 标记当前版本为有效
    void MarkCurrentVersionValid();

    // 获取固件版本
    const std::string& GetFirmwareVersion() const { return firmware_version_; }
    // 获取当前版本
    const std::string& GetCurrentVersion() const { return current_version_; }
    // 获取激活消息
    const std::string& GetActivationMessage() const { return activation_message_; }
    // 获取激活码
    const std::string& GetActivationCode() const { return activation_code_; }

private:
    std::string check_version_url_;          // 版本检查URL
    std::string activation_message_;         // 激活消息
    std::string activation_code_;            // 激活码
    bool has_new_version_ = false;           // 是否有新版本
    bool has_mqtt_config_ = false;           // 是否有MQTT配置
    bool has_server_time_ = false;           // 是否有服务器时间
    bool has_activation_code_ = false;       // 是否有激活码
    std::string current_version_;            // 当前版本
    std::string firmware_version_;           // 固件版本
    std::string firmware_url_;               // 固件下载URL
    std::string post_data_;                  // POST数据
    std::map<std::string, std::string> headers_;  // HTTP请求头

    // 执行固件升级
    void Upgrade(const std::string& firmware_url);
    // 升级进度回调函数
    std::function<void(int progress, size_t speed)> upgrade_callback_;
    // 解析版本号字符串为数字数组
    std::vector<int> ParseVersion(const std::string& version);
    // 检查是否有新版本可用
    bool IsNewVersionAvailable(const std::string& currentVersion, const std::string& newVersion);
};

#endif // _OTA_H
